2005-08-28 Analoges Aufnehmen - HOWTO Hier wird ein nötiges Basiswissen erklärt wie man unter Linux mit mencoder analoge Videos mit guter Qualität aufnehmen kann. 1. Einrichten von saa7134: hotplug müsste eigentlich alles automatisch erkennen und die Module richtig laden. Hier eine Liste der benötigten Module: saa7134 video_buf tuner Optionen für saa7134 werden mit modinfo saa7134 erklärt. Mit oss=1 kann man den Ton direkt als oss-device registrieren lassen. Da ich alsa verwende, musste ich mit dem mitgelieferten Kabel zum Line-In der Soundkarte gehen. root:/etc/modprobe.d# vi SAA7134 alias char-major-81 videodev options saa7134 gbuffers=32 gbuffers habe ich auf das maximum gesetzt. 2. Ton richtig einschalten Folgende Schalter müssen bei kmix gesetzt sein: Line, Capture: roter Kreis, Lautstärke nicht zu hoch Line-In As Surround: Disable Will man stattessen lieber mit dem Microphon aufnehmen, dann: Mic: roter Kreis, mit dem grünen Kreis kann man mithören 3. aufnehmen mit ffmpeg Das FFmpeg-Projekt ist das wohl wichtigste Codecprojekt für Linux und Unixartige Betriebssysteme. Es besteht aus den Teilen ffmpeg ffserver ffplay libavcodec libavformat Mit dem Konsolentool ffmpeg lassen sich verschiedene Videoformate in ein anderes konvertieren, sogar die direkte Aufnahme von einer TV-Karte ist möglich. Um beispielsweise die DivX-Datei mit einer Auflösung von 720x512 und 25 fps direkt von der TV-Karte /dev/video0 aufzunehmen verwendet man folgenden Aufruf: $ ffmpeg -vd /dev/video0 -b 720 -r 25 -s 720x512 -t 15 video.avi ffmpeg bestimmt anhand der Dateiendung der Ausgabedatei ein Format, bei AVI-Dateien standardmäßig MPEG4. Das Format läßt sich über den Schalter -fändern, eine Liste der gültigen Formate erfährt man durch $ ffmpeg -formats ffserver ist ein Multimedia-Streamserver für HTTP, ffplay ein einfacher Videoplayer auf der Basis von SDL. 5. JTVD jtvd ist ein Programm welches einfaches Aufnehmen von Videos verspricht. Das Programm ist in Java geschrieben. Die Qualtiät war mir unzureichend, darum habe ich die einstellbaren Parameter in jtvd getuned und dann den mencoder Befehl weiter verwendet. Ausgangsbasis: diesen Mencoder Command habe ich von JTVD: # JTVD command: mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=8:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vqscale=2 -oac mp3lame -lameopts q=2:mode=1 -o test3.avi es recht gut funktioniert, bis auf die Auflösung, Interlacing, Qualität und Breite. -force-avi-aspect ist für das Seitenverhältnis zuständig: 4/3 oder 16/9 -tv string setzt die video4linux parameter input setzt dabei die Videoquelle, aber dafür am besten jtvd verwenden! 0..television 1..composite1 (recommended) 2..s-video 3..composite2 freq setzt dabei die Frequenz 203,25..ORF1 224,25..ORF2 Die beste Bitrate konnte ich dadurch auf meinen System bestimmen: Best Bitrate: # JTVD command: mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o /var/rip/jtvd/files/bitrate4000.avi 6. Einführung Seitenverhältnisse "16:9 heißt, wie der Begriff schon verdeutlicht, daß sich Breite zu Höhe wie 16 zu 9 verhalten. Bei 768 Breite wären das 432 Höhe und bei 405 Höhe wären das 720 Breite." "Aaaaaber - genau bei letzterem Zahlenverhältnis befände sich Dein Lehrer auf dem Holzweg denn PAL-DV (darauf will er wahrscheinlich hinaus), normalerweise mit 720*576 aufgelöst, hat bei 16:9 trotzdem nicht 720*405 sondern 720*432 Pixel! Das kommt daher daß DV bei der Wiedergabe in der Breite um den Faktor 1,0667 gestreckt wird, in der Höhe aber unverändert bleibt. Die NICHTQUADARTISCHEN PIXEL des DV-Formates werden also bei der Wiedergabe gestreckt um eine 4:3 PAL-Anzeige zu realisieren. Wenn die DV-Pixel quadratisch WÄREN (sind sie aber nicht!) dann käme man rein rechnerisch auf den Wert von 405. Da es aber KEINE quadratischen Pixel sind, muß auch da die richtige Antwort 432 lauten. Eine Auflösung von 720*405 ist definitiv falsch, kommt in der Praxis nicht vor und kann mit vielen Codecs überhaupt nicht generiert werden weil sie eine durch 8 oder teilbare Auflösung erwarten." "Anamorph kodiertes Breitbild hat eine PAL-Auflösung von 720*576 Bildpunkten vor und 1024*576 Bildpunkte nach der Entzerrung." "Since you can use lavc for encoding both video and audio (-ovc lavc -oac lavc), you can pass options for both in the same configuration line in -lavcopts or in your mencoder config file." 7. Konfiguration von mencoder In ~/.mplayer/mencoder kann man Optionen angeben, die dann von mencoder verwendet werden. Ich habe hier nur die xvidencopts angegeben: File: ~/.mplayer/mencoder xvidencopts=fixed_quant=3:vhq=4:chroma_opt=1:hq_ac=1:interlacing=1:bvhq=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=6:quant_type=mpeg:gmc=1:max_overflow_improvement=15 8. audio codec (mp3) "mp3lame - cbr/abr/vbr MP3 using libmp3lame My default recommendation, encodes the audio using the MP3 format. If you're feeling adventurous, man mencoder and search for lameopts to see how to change VBR, ABR, etc. mencoder movie.wmv -o movie.avi -ovc lavc -oac mp3lame audio codec (mp2) - faster and little bigger If no options are passed in -lavcopts, then lavc will encode the audio to mp2. Use the acodec argument with lavcopts to change the audio codec. This example will encode the audio stream to mp3, using the ffmpeg libraries. mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc -lavcopts acodec=mp3 Author's Note: As a matter of opinion, using mp2 instead of mp3 is a reasonable price to pay for a faster encoding. From my experience, the size difference is not an issue." Ich habe entgegen dieser Entscheidung mp3 verwendet. Das bringt dann die zusätzlichen Parameter: -oac mp3lame -lameopts cbr:br=192:mode=1 -oac entscheided über das Programm -lameopts gibt Paramter für lame, bei mir war die Bitrate 192 optimal 9. Suche beste mencoder Befehl: Ausgang: mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o lavc.avi Versuche XviD zu verwenden: mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc xvid -xvidencopts fixed_quant=3:vhq=0:chroma_opt=1:hq_ac=1:interlacing=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=2:quant_type=mpeg:gmc=1:max_overflow_improvement=15 -oac mp3lame -lameopts cbr:br=192:mode=1 -o xvid.avi me_quality und vhq so hoch stellen, dass der Prozessor noch mitkommt (nicht nur 5 fps o.ä.) (bringt nichts sichtbares und belastet cpu viel mehr) -------------- vorletzte Version 16/9 (mit interlacing problem) ------------------- mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 16-9.avi -------------- vorletzte Version 4/3 (mit interlacing problem)------------------- mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 4-3.avi -------------- vorletzte Version ------------------- 10. Kurze Videos erzeugen. Da es viel einfacher ist Videos zusammenzufügen (avimerge -o name -i file ...; bei transcode dabei) als sie auseinanderzukriegen (avidemux) habe ich versucht beim Auslesen der Videokamera möglichst kurze Sequenzen zu erzeugen, die man dann im Notfall immer noch zusammengeben kann! Dieses Skript einfach ausführen und mit Strg+C immer an geeigneten Szenenwechseln veranlassen eine neue Datei zu generieren. Die erzeugten Dateien heißen einfach der Reihe nach 1.avi -> 2.avi -> ... Bei längeren Stückerln kann man dann den Namen in Ordnung bringen. for i in `seq -w 01 99` do mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi mv current.avi "$i.avi" done 11. Interlacing Problem Von "Matthias Wieser": "Sicher? Der obige Bildausschnitt sieht so aus, wie wenn du zusätzlich den pp=lb Deinterlacer verwendet hättest. Unabhängig davon, du kannst nicht erwarten, dass man nach einer verlustbehafteten Kompression anschließend noch sauber alle ungeraden Bildzeilen von den geraden trennen kann. Also: Entweder bei der Aufnahme deinterlacen, oder interlaced aufzeichnen und erst im Abspielprogramm Deinterlacing anschalten. Für letzteres gibt es zwei Mencoder Optionen, die dies anschalten. Die eine ist "ildct", die andere musst du selbst in der man-page nachschlagen." mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf crop=650:540:30:20 -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi "Ach ja, wenn du statt "-vf hqdn3d" "-vf denoise3d" (oder gar lavcopts nr=400) verwendest, bleibt auch noch genügend Rechenzeit für Mplayers Deinterlacinf-Filter übrig. Empfehlenswert sind (pp=lb, pp=l5, pp=fd oder -vf kerndeint). Besser ist es aber wohl, nichts am Video zu verändern, sondern gleich interlaced (s.o.) aufzuzeichnen. Die Deinterlacer vom Mplayer sind alle nicht so gut. Du solltest auch die schwarzen Ränder vom Video abschneiden, würden Fernseher eh machen. Das verringert den CPU-Bedarf und verbessert die Komprimierbarkeit. z.B.: -vf crop=672:544:24:16" 12. XviD XviD ist also ein open-source MPEG4-Codec, der hochqualitative Ergebnisse liefert. Er unterstüzt Features wie mehrere B-Frames, Quarter pixel motion compensation, Global motion compensation, Lumi masking, Trellis Quantisierung, sowie H.263, MPEG und eigene Quantisierungsmatrizen. -------------- letzte Version (16/9 - s-video) ------------------- mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi -------------- letzte Version (4/3 - composite) ----------------- mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=1:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:548:24:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi -------------- letzte Version (4/3 - TV) -------------------------- mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=0:freq=203,25:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=714:548:0:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi -------------- Schleife mit s-video (Übertragung von Videofilmen) ---------- for i in `seq -w 01 99` do mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi mv current.avi "$i.avi" done -------------- letzte Version ------------------------------------- Diese Tipps haben mich dann zu den letzendlichen mencoder Befehl geführt. Achtung! Da hier xvid verwendet werden, ist auch die obige xvid Konfiguration von Bedeutung. Erklärung der Paramter: -vf-add: Um eine Filterkette aufzubauen, benötigt man -vf-add. Dieser Filter werden dann alle hintereinander ausgeführt. crop: dieser Filter schneidet den schwarzen Rand weg kerndeint: kümmert sich um das interlacing vcodec=xvid: Ganz wichtig, erst dadurch wird der wesentlich bessere xvid codec aktivert {Referenzen} http://gentoo-wiki.com/HOWTO_Mencoder_Introduction_Guide http://www.linuxforen.de/forums/showthread.php?t=88454 http://mplayerhq.hu/DOCS/HTML/de/encoding.html